﻿using System;
using System.Security.Cryptography;
using System.Text;
using System.Web.Mvc;
using System.Web.Security;
using GestionEducativa.Models;
using System.IO;


namespace GestionEducativa.Controllers
{
    public class LoginController : Controller
    {
        //
        // GET: /Login/

        public ActionResult Inicio()
        {
            return
                View();
        }

        [HttpPost]
        public ActionResult Inicio(UsuarioViewModel Datos, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                UsuarioViewModel usuario = new UsuarioViewModel().ObtenerUsuario(Datos.Usuario);

                string hash = ObtenerHash(Datos.Contraseña);

                if (hash == usuario.Contraseña)
                {
                    if (usuario.Estado)
                    {
                        System.Web.HttpContext.Current.Session["nivel"] = usuario.Rol;

                        if (!string.IsNullOrWhiteSpace(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                        {
                            FormsAuthentication.SetAuthCookie(Datos.Usuario, false);
                            return
                                Redirect(returnUrl);
                        }
                        FormsAuthentication.SetAuthCookie(Datos.Usuario, false);
                        return
                            RedirectToAction("Index", "GestionEscolar");
                    }
                    else
                    {
                        ModelState.AddModelError("", "Su usuario existe pero no esta habilitado, por favor póngase en contacto con el Administrador del Sistema.");

                        return
                            View();
                    }

                }
                else
                {
                    ModelState.AddModelError("", "");

                    return
                        View();
                }
            }
            return
                View();
        }

        public ActionResult CerrarSesion()
        {
            FormsAuthentication.SignOut();
            Session.Abandon();

            return
                RedirectToAction("Inicio", "Login");
        }

        public ActionResult ControlUsuario()
        {
            return View();
        }

        [HttpGet]
        public ActionResult NuevoUsuario(int? verificacion)
        {
            if (verificacion != null)
            {
                ViewData["listar"] = new SelectList(new UsuarioViewModel().Roles(), "idrol", "rol");

                return
                    View();
            }
            return
                View("Pagina no disponible.");
        }

        [HttpPost]
        public string NuevoUsuario(string idnumemp, string idusu, string contra, string idrol)
        {
            string valor = UsuarioViewModel.AgregarUsuario(idnumemp, idusu, contra, idrol);

            return
                valor;
        }

        [HttpGet]
        public ActionResult BorrarUsuario()
        {
            ViewData["listae"] = new SelectList(new UsuarioViewModel().NumeroEmpleadoU());
            return View();
        }

        [HttpPost]
        public ActionResult BorrarUsuario(string idnumemp, string idusu)
        {
            DatosViewModel datos = new DatosViewModel();

            //Si presiona el boton Buscar.
            if (string.IsNullOrWhiteSpace(idusu))
            {
                UsuarioViewModel usuario = new UsuarioViewModel().ObtenerUsuario(Convert.ToInt32(idnumemp));
                var empleado = UsuarioViewModel.TraerEmpleado(Convert.ToInt32(idnumemp));
                if (empleado != null)
                {
                    if (usuario.Usuario != null)
                    {
                        if (usuario.Estado)
                        {
                            datos.vof = true;
                            datos.usuario = usuario.Usuario;
                        }
                        else
                        {
                            datos.vof = false;
                            datos.valor = "inactivo";
                        }

                    }
                    else
                    {
                        datos.vof = false;
                    }
                }
                else
                {
                    datos.vof = false;
                    datos.valor = "ne";
                }

                return
                    Json(datos, JsonRequestBehavior.AllowGet);
            }

            //Si presiona el boton Deshabilitar o habilitar.
            if (UsuarioViewModel.DOHU(Convert.ToInt32(idnumemp)))
            {
                datos.vof = true;

                return
                    Json(datos, JsonRequestBehavior.AllowGet);
            }
            datos.vof = false;
            return
                Json(datos, JsonRequestBehavior.AllowGet);


        }

        [HttpGet]
        public ActionResult ModificarUsuario()
        {
            ViewData["listar"] = new SelectList(new UsuarioViewModel().Roles(), "idrol", "rol");

            return View();
        }

        [HttpPost]
        public ActionResult ModificarUsuario(string idnumemp, string contraseña, string idrol)
        {
            //Si presiona boton buscar.
            if (string.IsNullOrWhiteSpace(idrol))
            {
                DatosViewModel datos = UsuarioViewModel.ModificarUsuarioObt(idnumemp);

                return
                   Json(datos, JsonRequestBehavior.AllowGet);
            }

            //Si presiona boton modificar.
            DatosViewModel datosMU = new DatosViewModel();

            datosMU.valor = UsuarioViewModel.ModificarUsuario(idnumemp, contraseña, idrol);
            return
                Json(datosMU, JsonRequestBehavior.AllowGet);
        }

        public ActionResult PerfilUsuario()
        { 
            return View();
        }

        [HttpPost]
        public ActionResult PerfilUsuario(string nomusu, string con, string ncon, string ccon)
        {
            DatosViewModel dato = new DatosViewModel();

            if (!string.IsNullOrWhiteSpace(nomusu) && !string.IsNullOrWhiteSpace(con)
                && !string.IsNullOrWhiteSpace(ncon) && !string.IsNullOrWhiteSpace(ccon))
            {
                UsuarioViewModel usuario = new UsuarioViewModel().ObtenerUsuario(nomusu);
                con = ObtenerHash(con);

                if (con == usuario.Contraseña)
                {
                        usuario.Contraseña = ObtenerHash(ncon);
                        UsuarioViewModel.ActualizarUsuario(UsuarioViewModel.TransformarUMEU(usuario));

                        dato.vof = true;
                        dato.valor = "a";
                        return
                            Json(dato, JsonRequestBehavior.AllowGet);
                }
                else
                {
                    dato.vof = false;
                    dato.valor = "cai";
                    return
                        Json(dato, JsonRequestBehavior.AllowGet);
                }
            }
            else
            {
                dato.vof = false;
                dato.valor = "v";
                return
                    Json(dato, JsonRequestBehavior.AllowGet);
            }

        }

        //Este metodo se encarga de codificar la contraseña
        //y obtiene un Hash que es nombre de la codificacion de la contraseña
        /// <summary>
        /// Tomo un string y lo encripta 
        /// </summary>
        /// <param name="Contraseña"></param>
        /// <returns>string</returns>
        public static string ObtenerHash(string Contraseña)
        {
            MD5 md5Hast = MD5.Create();

            byte[] datos = md5Hast.ComputeHash(Encoding.Default.GetBytes(Contraseña));

            StringBuilder hash = new StringBuilder();

            for (int i = 0; i < datos.Length; i++)
            {
                hash.Append(datos[i].ToString("x2"));
            }

            return
                hash.ToString();
        }
    }
}
